package com.cskaoyan.javase.array._5operation._4copy;

import com.sun.org.apache.bcel.internal.generic.RETURN;
import com.sun.org.apache.regexp.internal.RE;

import java.util.Arrays;

/**
 * 通过数组的拷贝,实现数组的扩容或者删除元素等
 *
 * @since 15:51
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 1, 1, 3, 2, 1, 4, 5};
        System.out.println(Arrays.toString(arr));

        // int[] newArr = realInsertElement(arr, 10);
        // System.out.println(Arrays.toString(newArr));

        int[] newArr = realDeleteElement(arr, 1);
        System.out.println(Arrays.toString(newArr));

    }

    // 需求1: 在int数组中(真实的)新增一个元素
    /*
        数组对象的长度是固定的,所以数组不可能真的在原先数组的基础上直接新增元素
            于是只能创建一个新数组,然后拷贝赋值
            分析过程:
                1.首先是创建新数组,长度是老数组长度+1
                2.给新数组赋值,将老数组中的元素全部复制过去
                3.插入新元素
                4.返回新数组
     */

    /**
     * 真实的将一个元素插入数组(当然这是通过创建新数组实现的)
     * @param old 老数组,被插入元素的数组
     * @param target 被插入的元素
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/03 15:55
     */
    public static int[] realInsertElement(int[] old, int target) {
        // 1.首先是创建新数组,长度是老数组长度+1
        int[] result = new int[old.length + 1];
        // 2.给新数组赋值,将老数组中的元素全部复制过去
        // 新数组一定比老数组长,这里要遍历老数组,然后赋值,这样做不会下标越界
        // 新数组拷贝元素需要下标,所以我们可以定义一个下标
        int newIndex = 0;
        for (int oldEle : old) {
            result[newIndex] = oldEle;
            newIndex++;
        }
        // 3.插入新元素
        // 这时新数组中,只有最后一个位置是空的,直接插入即可
        result[result.length - 1] = target;
        // 4.返回新数组
        return result;
    }


    // 需求2: 在int数组中(真实的)删除某个元素
    /*
        分析:
            首先要清楚,被删除的元素,可能在数组中有多个
            所以实现这个功能首先要搞清楚删除了几个元素

            新数组的长度 = 老数组的长度 - 删除元素的个数
            创建出新数组后,从老数组中复制元素进新数组,但是要过滤掉那些被删除的元素,这样就得到了新数组,实现了删除的效果
     */
    /**
     * 通过拷贝过滤元素,达成删除元素的效果
     * @param old 被删除元素的老数组
     * @param target 删除的目标元素
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/03 16:05
     */
    public static int[] realDeleteElement(int[] old,int target){
        // 首先需要创建新数组
        // 首先需要知道被删除元素的个数,所以需要计数,需要计数器
        int count = 0;
        for (int oldEle : old) {
            if (oldEle == target){
                count++;
            }
        }
        // 代码运行到这里,count等于要删除元素的个数
        // 新数组的长度 = 老数组的长度 - 删除元素的个数
        int[] result = new int[old.length - count];

        // 遍历数组,然后复制过滤,完成赋值,仍然需要遍历老数组
        int newIndex = 0;
        for (int oldEle : old) {
            // 过滤掉被删除的元素
            if (oldEle == target){
                continue;
            }
            result[newIndex] = oldEle;
            newIndex++;
        }
        return result;
    }
}
